package com.bitoon.basketdudes.web.jpa;

import java.io.Serializable;
import java.util.*;
import javax.persistence.*;
import java.text.SimpleDateFormat;

@Entity
@Table(name = "usuario", schema="central")

@NamedQueries({
    @NamedQuery(name = "Usuario.findByNickPassword", query = "SELECT u FROM Usuario u WHERE u.nick = :nick AND u.password = :password"),
    @NamedQuery(name = "Usuario.findByNick", query = "SELECT u FROM Usuario u WHERE u.nick = :nick AND (u.status = 1 OR u.status = 0)"),
    @NamedQuery(name = "Usuario.findByEmail", query = "SELECT u FROM Usuario u WHERE LOWER(u.email) = :email"),
    @NamedQuery(name = "Usuario.findById", query = "SELECT u FROM Usuario u WHERE u.id = :id"),
    @NamedQuery(name = "Usuario.findByFirstLetters", query = "SELECT u FROM Usuario u WHERE u.nick >= :letraDesde and u.nick < :letraHasta ORDER BY u.nick"),
    @NamedQuery(name = "Usuario.findByNickAdmin", query = "SELECT u FROM Usuario u WHERE u.nick = :nick")
})

public class Usuario implements Serializable {
    private static long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="usuario_id_generator", sequenceName="usuario_id_seq", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="usuario_id_generator")
    private Integer id;

    private String nick;

    @Column(name="nick_mostrar")
    private String nickMostrar;

    private String email;

    private String password;

    @Column(name="password_md5")
    private String passwordMd5;

    private Integer puntos;

    private float creditos;

    @Column(name = "f_alta")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fAlta;

    @Column(name="f_admision")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fAdmision;

    @Column(name="f_ultimo")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fUltimo;

    private Integer status;

    private Integer genero;

    @Column(name="f_nacim")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fNacimiento;

    //bi-directional many-to-one association to Pais

    @ManyToOne
    @JoinColumn(name="pais_id")
    private Pais pais;

    @OneToMany(mappedBy="usuario", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @OrderBy("nombre")
    public List<Equipo> equipos;

    @Column(name="origen_id")
    private int origen;

    @Column(name="idioma_id")
    private String idioma;

    private Integer reputacion;

    private Integer perfil;

    public List<Equipo> getEquipos() {
        return equipos;
    }

    public void setEquipos(List<Equipo> equipos) {
        this.equipos = equipos;
    }

    private Integer robinson;

    // Métodos

    public Usuario() {
        //equipos = new ArrayList<Equipo>();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNick() {
        return Integer.toString(id);
        //return nick;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }

    public String getNickMostrar() {
        return nickMostrar;
    }

    public void setNickMostrar(String nickMostrar) {
        this.nickMostrar = nickMostrar;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getPuntos() {
        return puntos;
    }

    public void setPuntos(Integer puntos) {
        this.puntos = puntos;
    }

    public float getCreditos() {
        return creditos;
    }

    public void setCreditos(float creditos) {
        this.creditos = creditos;
    }

    public Date getfAlta() {
        return fAlta;
    }

    public void setfAlta(Date fAlta) {
        this.fAlta = fAlta;
    }

    public Date getfAdmision() {
        return fAdmision;
    }

    public void setfAdmision(Date fAdmision) {
        this.fAdmision = fAdmision;
    }

    public Date getfUltimo() {
        return fUltimo;
    }

    public void setfUltimo(Date fUltimo) {
        this.fUltimo = fUltimo;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Integer getGenero() {
        return genero;
    }

    public void setGenero(Integer genero) {
        this.genero = genero;
    }

    public Date getfNacimiento() {
        return fNacimiento;
    }

    public void setfNacimiento(Date fNacimiento) {
        this.fNacimiento = fNacimiento;
    }

    public Pais getPais() {
        return pais;
    }

    public void setPais(Pais pais) {
        this.pais = pais;
    }

    public Integer getRobinson() {
        return robinson;
    }

    public void setRobinson(Integer robinson) {
        this.robinson = robinson;
    }

    // Para la fecha de nacimiento

    public int getDiaFNacimiento() {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(fNacimiento);
        return gc.get(gc.DATE);
    }

    public int getMesFNacimiento() {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(fNacimiento);
        return gc.get(gc.MONTH)+1;
    }

    public int getAnyoFNacimiento() {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime(fNacimiento);
        return gc.get(gc.YEAR);
    }

    public String getPasswordMd5() {
        return passwordMd5;
    }

    public void setPasswordMd5(String passwordMd5) {
        this.passwordMd5 = passwordMd5;
    }

    public int getOrigen() {
        return origen;
    }

    public void setOrigen(int origen) {
        this.origen = origen;
    }

    public Integer getReputacion() {
        return reputacion;
    }

    public void setReputacion(Integer reputacion) {
        this.reputacion = reputacion;
    }

    public Integer getPerfil() {
        return perfil;
    }

    public void setPerfil(Integer perfil) {
        this.perfil = perfil;
    }

    public String getIdioma() {
        return idioma;
    }

    public void setIdioma(String idioma) {
        this.idioma = idioma;
    }

    // Para las fechas de la BD: fecha admision, alta y ultimo login
    //devuelve las fechas para que sean mas comprensibles
    public String getFechaFormateadafAdmision() {
        String formato ="";
        if(fAdmision != null){
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTime(fAdmision);
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy - H'h'm");
            formato = format.format(gc.getTime());
        }
        return formato;
    }

    public String getFechaFormateadafUltimo() {
        String formato ="";
        if(fUltimo != null){
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTime(fUltimo);
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy - H'h'm");
            formato = format.format(gc.getTime());
        }
        return formato;
    }

    public String getFechaFormateadafAlta() {
        String formato ="";
        if(fAlta != null){
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTime(fAlta);
            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy H'h'm");
            formato = format.format(gc.getTime());
        }
        return formato;
    }

  
   
}